package fox.framework.rpc.client.node;

import fox.framework.rpc.client.node.rule.Rule;
import fox.framework.rpc.converter.RpcMessageConverter;

import java.util.List;

/**
 * Rpc元数据逻辑空间
 * @author cuichao
 * @Description: RpcMetadata
 * @Date: create in 2021/1/7 16:19
 */
public interface RpcMetadata {
    /**
     * Rpc逻辑空间名称
     * @return
     */
    String metaspace();

    /**
     * 元空间下是否存在该节点
     * @param node
     * @return
     */
    boolean containNode(RpcNode node);
    /**
     * 获取Rpc逻辑空间下所有节点
     * @return
     */
    List<RpcNode> getAllNodes();
    /**
     * 获取Rpc逻辑空间下可用节点
     * @return
     */
    List<RpcNode> getAvailableNodes();
    /**
     *  获取Rpc逻辑空间下状态为暂停节点
     * @return
     */
    List<RpcNode> getPauseStateNodes();
    /**
     * 添加RpcNode
     * @param node
     */
    void addNode(RpcNode ...node);
    /**
     * 是否为懒加载模式
     * @return
     */
    boolean isLazy();
    /**
     * 该metadata是否已经抓取过元数据
     * @return
     */
    boolean isFetched();
    /**
     * 设置RpcNode状态
     * @param node
     * @param state
     */
    void setNodeState(RpcNode node , int state);
    /**
     * 获取Rpc节点选择器
     * @return
     */
    Rule rule();
    /**
     * 消息转换器
     * @return
     */
    RpcMessageConverter getMessageConverter();


}
